﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using CrmContacto.Contracts;
using CrmContacto.Contracts.Contracts.Search;
using CrmContacto.Contracts.Enums;
using CrmContacto.WebApp.Code.InnerClasses;
using Web.CrmContacto.Code;
using Web.Framework;
using Web.Framework.Misc;

namespace CrmContacto.WebApp.App
{
    public partial class ExportCustomer : BasePage
    {
        List<ColumnasParaGrilla> columnasParaGrillaList;
        List<MaestroBase> tipoDocumentoList;

        private CustomerSearchParam CustomerSearchParamSession
        {
            get
            {
                return (CustomerSearchParam)StoreHelper.GetObject(MiscClass.CustomerSearchParamCacheKey);
            }
            set
            {
                StoreHelper.StoreObject(MiscClass.CustomerSearchParamCacheKey, value);
            }
        }

        protected override void OnPreLoad(EventArgs e)
        {
            base.OnPreLoad(e);

            var obj = StoreHelper.GetObject(MiscClass.CustomerColumnsKey);
            if (obj != null)
            {
                var columnasCache = (List<ColumnasParaGrilla>)obj;
                columnasParaGrillaList = new List<ColumnasParaGrilla>();
                foreach (var columna in columnasCache)
                {
                    columnasParaGrillaList.Add(new ColumnasParaGrilla()
                    {
                        ColumnName = columna.ColumnName,
                        ColumnDescription = columna.ColumnDescription,
                        PosicionDestino = columna.PosicionDestino - 2,
                        PosicionOriginal = columna.PosicionOriginal - 2,
                        Visible = columna.Visible
                    });
                }

                DataControlFieldCollection columnasClonadas = this.GridCustomer.Columns.CloneFields();

                // Por cada columna reordeno
                foreach (ColumnasParaGrilla columnaParaGrilla in columnasParaGrillaList)
                {
                    if (columnaParaGrilla.Visible)
                    {
                        if (columnaParaGrilla.PosicionOriginal != columnaParaGrilla.PosicionDestino)
                        {
                            this.GridCustomer.Columns.RemoveAt(columnaParaGrilla.PosicionDestino);
                            this.GridCustomer.Columns.Insert(columnaParaGrilla.PosicionDestino, columnasClonadas[columnaParaGrilla.PosicionOriginal]);
                        }
                    }
                    else
                    {
                        this.GridCustomer.Columns[columnaParaGrilla.PosicionDestino].Visible = false;
                    }
                }
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            WebServiceHelper wsHelper = new WebServiceHelper();

            tipoDocumentoList = GetTipoDocumento(0);

            if (CustomerSearchParamSession != null)
            {
                int pageSize = 0;
                int pageSkip = 0;
                try
                {
                    pageSize = CustomerSearchParamSession.PageSize;
                    pageSkip = CustomerSearchParamSession.PageSkip;

                    CustomerSearchParamSession.PageSize = 0;
                    CustomerSearchParamSession.PageSkip = 0;

                    //if (CustomerSearchParamSession.SearchSelectAll)
                    //{
                    //    //CustomerSearchParamSession.Ids = new List<int>();
                    //}

                    var result = WebServiceHelper.GetCustomers(CustomerSearchParamSession);
                    this.GridCustomer.DataSource = result.Resultados;
                    this.GridCustomer.DataBind();

                    this.EnableViewState = false;

                    using (StringWriter sw = new System.IO.StringWriter())
                    {
                        using (HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw))
                        {                          
                            HttpContext context = HttpContext.Current;                            
                            
                            Response.AddHeader("content-disposition", "attachment;filename=Clientes.xls");

                            context.Response.ContentType = "application/vnd.ms-excel";
                            context.Response.Clear();                          

                            HtmlForm frm = new HtmlForm();
                            this.GridCustomer.Parent.Controls.Add(frm);
                            frm.Attributes["runat"] = "server";
                            frm.Controls.Add(this.GridCustomer);
                            frm.RenderControl(htw);

                            //GridCustomer.RenderControl(htw);
                            context.Response.Write(sw.ToString());
                            //context.Response.Write("</body>");
                            context.Response.Flush();
                            context.Response.End();

                            htw.Close();
                        }

                        sw.Close();
                    }
                }
                finally
                {
                    CustomerSearchParamSession.PageSize = pageSize;
                    CustomerSearchParamSession.PageSkip = pageSkip;
                }
            }
        }

        protected void GridCustomer_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Cliente cliente = (Cliente)e.Row.DataItem;

                // Bindeo la grilla con comandos
                Panel pnlEngineCommand = (Panel)e.Row.FindControl("pnlEngineCommand");

                int tipoDocIndex = columnasParaGrillaList.Where(c => c.ColumnName == "TipoDocumentoId").Single().PosicionDestino;
                if (cliente.TipoDocumentoId.HasValue)
                {
                    foreach (MaestroBase tipoDoc in this.tipoDocumentoList)
                    {
                        if (Convert.ToInt32(tipoDoc.Id) == cliente.TipoDocumentoId.Value)
                        {
                            e.Row.Cells[tipoDocIndex].Text = tipoDoc.Nombre;
                            break;
                        }
                    }
                }
                else
                {
                    e.Row.Cells[tipoDocIndex].Text = string.Empty;
                }

                int estadoEmailIndex = columnasParaGrillaList.Where(c => c.ColumnName == "EstadoEmail").Single().PosicionDestino;
                if (cliente.EstadoEmail.HasValue)
                {
                    EstadoEmail estadoEmail = (EstadoEmail)cliente.EstadoEmail.Value;
                    e.Row.Cells[estadoEmailIndex].Text = UIHelper.GetEnumDescription(estadoEmail);
                }
                else
                {
                    e.Row.Cells[estadoEmailIndex].Text = string.Empty;
                }

                int estadoIndex = columnasParaGrillaList.Where(c => c.ColumnName == "Estado").Single().PosicionDestino;
                if (cliente.Estado.HasValue)
                {
                    EstadoCliente estadoCliente = (EstadoCliente)cliente.Estado.Value;
                    e.Row.Cells[estadoIndex].Text = UIHelper.GetEnumDescription(estadoCliente);
                }
                else
                {
                    e.Row.Cells[estadoIndex].Text = string.Empty;
                }

                int paisIndex = columnasParaGrillaList.Where(c => c.ColumnName == "Nacionalidad").Single().PosicionDestino;
                if (cliente.NacionalidadId.HasValue)
                {
                    int nacionalidadId = cliente.NacionalidadId.Value;
                    e.Row.Cells[paisIndex].Text = this.GetPaises().Where(p => p.Id == nacionalidadId).Single().Nombre;
                }
                else
                {
                    e.Row.Cells[paisIndex].Text = string.Empty;
                }

                int provinciaIndex = columnasParaGrillaList.Where(c => c.ColumnName == "ProvinciaId").Single().PosicionDestino;
                if (cliente.NacionalidadId.HasValue && cliente.ProvinciaId.HasValue)
                {
                    int provinciaId = cliente.ProvinciaId.Value;
                    var provincia = this.GetProvincias(cliente.NacionalidadId.Value).Where(p => p.Id == provinciaId).SingleOrDefault();
                    if (provincia != null)
                        e.Row.Cells[provinciaIndex].Text = provincia.Nombre;
                    else
                    {
                        e.Row.Cells[provinciaIndex].Text = string.Empty;
                    }
                }
                else
                {
                    e.Row.Cells[provinciaIndex].Text = string.Empty;
                }

                int origenIndex = columnasParaGrillaList.Where(c => c.ColumnName == "OrigenId").Single().PosicionDestino;
                e.Row.Cells[origenIndex].Text = UIHelper.GetEnumDescription((TipoContactoOrigen)cliente.OrigenId);

                int origenPuntoDeVentaIndex = columnasParaGrillaList.Where(c => c.ColumnName == "OrigenPuntoDeVentaId").Single().PosicionDestino;
                if (cliente.OrigenPuntoDeVentaId.HasValue)
                {
                    e.Row.Cells[origenPuntoDeVentaIndex].Text = this.GetPuntosDeVenta(cliente.EmpresaId).Where(p => p.Id == cliente.OrigenPuntoDeVentaId.Value).Single().Nombre;
                }
                else
                {
                    e.Row.Cells[origenPuntoDeVentaIndex].Text = string.Empty;
                }

                if (cliente.Sexo.HasValue)
                {
                    int sexoIndex = columnasParaGrillaList.Where(c => c.ColumnName == "Sexo").Single().PosicionDestino;
                    SexoEnum sexoEnum = (SexoEnum)cliente.Sexo.Value;
                    e.Row.Cells[sexoIndex].Text = UIHelper.GetEnumDescription(sexoEnum);
                }

                if (cliente.CantidadHijos.HasValue)
                {
                    int cantHijosIndex = columnasParaGrillaList.Where(c => c.ColumnName == "CantidadHijos").Single().PosicionDestino;
                    ContactoCantidadHijos cantHijosEnum = (ContactoCantidadHijos)cliente.CantidadHijos.Value;
                    e.Row.Cells[cantHijosIndex].Text = UIHelper.GetEnumDescription(cantHijosEnum);
                }

                if (cliente.EdadHijoMenor.HasValue)
                {
                    int edadHijosIndex = columnasParaGrillaList.Where(c => c.ColumnName == "EdadHijoMenor").Single().PosicionDestino;
                    ContactoEdadHijoMenor edadHijoEnum = (ContactoEdadHijoMenor)cliente.EdadHijoMenor.Value;
                    e.Row.Cells[edadHijosIndex].Text = UIHelper.GetEnumDescription(edadHijoEnum);
                }
            }
        }
    }
}